package cn.itcast.demo.filters;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

//@Order(-1)
//@Component
public class LoginFilter implements GlobalFilter {
    /**
     * 需求：定义全局过滤器，拦截请求，判断请求的参数是否满足下面条件：
     * - 参数中是否有authorization，
     * - authorization参数值是否为admin
     * 如果同时满足则放行，否则拦截
     *
     * 处理当前请求，有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理
     * @param exchange  请求上下文，里面可以获取Request、Response等信息
     * @param chain 用来把请求委托给下一个过滤器
     * @return {@code Mono<Void>} 返回标示当前过滤器业务结束
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1.获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        //2.获取参数中的 authorization
        String auth = queryParams.getFirst("authorization");
        //3.判断参数是否为空，是否等于指定值
        if(auth == null || !auth.equals("admin")){
            //4.否，拦截
            //4.1.禁止访问，设置状态码
            exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
            //4.2.结束处理
            return exchange.getResponse().setComplete();
        }
        //5.是，放行
        return chain.filter(exchange);
    }
}
